
var str = "Hello, playground"

var playgroundGreeting = str

//改变了playgroundGreeting,并没有改变str的值
playgroundGreeting += " How are you today"

str


//创建一个类
class GreekGod {
    var name:String
    init(name:String){
        self.name = name
    }
}

let hecate = GreekGod(name:"Hecate")
let anotherHecate = hecate

//修改了一个实例的属性,另一个也变了
//说明两个实例其实是引用了同一个对象
anotherHecate.name = "anotherHecate"
anotherHecate.name
hecate.name

//创建一个结构体
struct Pantheon {
    var chiefGod:GreekGod
}

let pantheon = Pantheon(chiefGod:hecate)

let zeus = GreekGod(name:"Zeus")

//声明为值类型的常量,不能更改属性
//pantheon.chiefGod = zeus


//引用类型的常量实例,可以改变实例的属性
zeus.name = "Zeus Jr."
zeus.name


pantheon.chiefGod.name
let greekPantheon = pantheon
hecate.name = "Trivia"
greekPantheon.chiefGod.name

//相等与同一
//相等:两个实例的可见的特征具有一样的值,比如两个String实例具有相同的文本
//统一:两个常量或变量指向内存中的同一个实例
let x = 1
let y = 1
x == y

//因为x和y是值类型,这两个常量不能基于内存中的位置作比较
//所以不能使用 === 作比较
//x === y

//两个常量或两个变量可能相等(具有相同的值)但不同一(指向给定类型的不同实例);但是反过来不成立:如果两个变量或常量指向内存中的同一个实例， 那它们一定也相等。
